#pragma once
#include "../variant.h"
#include "system.h"
#include <armadillo>

#ifdef GRAPHENETOOLS_EXPORTS
#ifndef GRAPHENETOOLS_DLL_API
#define GRAPHENETOOLS_DLL_API __declspec(dllexport)
#endif
#else
#ifndef GRAPHENETOOLS_DLL_API
#define GRAPHENETOOLS_DLL_API __declspec(dllimport)
#endif
#endif

class GRAPHENETOOLS_DLL_API HamiltonFunctor
{
	System* sys;
	double bias;
	
	static const string biassymbol;
public:
	HamiltonFunctor(System *s, const rule::list &opts = rule::list());

	complex getHamiltonElement(const Bond &b, arma::vec k, double v);
		
	arma::sp_cx_mat getTransferIntegral(int id, arma::vec k);
	arma::sp_cx_mat getTransferIntegral(int id, arma::vec k, double v);
};

